package org.balthie.demo.jvm.bytecode;

// 常量池：保存class文件中的下面两类信息
// 1，字面量(Literal)： 字符串字面量，声明为final的基本类型常量的值
// 2，符号引用(signal): 接口名、类名、方法名、属性名；  类或接口的符号引用、字段的符号引用、类中方法的符号引用、接口中方法的符号引用、字段或方法的部分符号引用 （即指向其它内存地址的指针）
public class StringByteCode {

    private final String finalStr = "finalStr";

    private static String staticStr1;

    private static final String staticFinalStr1;

    private static String staticStr2 = "staticStr2";

    private static final String staticFinalStr2 = "staticFinalStr2";

    private final String finalObjStr = new String("finalObjStr");

    private static String staticObjStr1;

    private static final String staticFinalObjStr1;

    private static String staticObjStr2 = new String("staticObjStr2");

    private static final String staticFinalObjStr2 = new String("staticFinalObjStr2");

    static {
        staticStr1 = "staticStr1";
        staticFinalStr1 = "staticFinalStr1";

        staticObjStr1 = new String("staticObjStr1");
        staticFinalObjStr1 = new String("staticFinalObjStr1");
    }
    
    public static void main(String[] args) {
        String s1 = "s1";
        String s2 = "s2";
        String s3 = s1 + s2;
        String os1 = new String("s1");
        String os2 = new String("s2");
        String os3 = os1 + os2;
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(os1);
        System.out.println(os2);
        System.out.println(os3);
    }
}

// 字节码：
//ClassFile {
//	CAFEBABE 0000 0034 0064 ConstantPool {
//		class 07 0002
//		utf8 01 "org/balthie/demo/jvm/bytecode/StringByteCode"
//		class 07 0004
//		utf8 01 "java/lang/Object"
//		utf8 01 "finalStr"
//		utf8 01 "Ljava/lang/String;"
//		utf8 01 "ConstantValue"
//		string 08 0005
//		utf8 01 "staticStr1"
//		utf8 01 "staticFinalStr1"
//		utf8 01 "staticStr2"
//		utf8 01 "staticFinalStr2"
//		string 08 000C
//		utf8 01 "finalObjStr"
//		utf8 01 "staticObjStr1"
//		utf8 01 "staticFinalObjStr1"
//		utf8 01 "staticObjStr2"
//		utf8 01 "staticFinalObjStr2"
//		utf8 01 "<clinit>"
//		utf8 01 "()V"
//		utf8 01 "Code"
//		string 08 000B
//		fieldRef 09 0001 0018
//		nameAndType 0C 000B 0006
//		class 07 001A
//		utf8 01 "java/lang/String"
//		string 08 0011
//		methodRef 0A 0019 001D
//		nameAndType 0C 001E 001F
//		utf8 01 "<init>"
//		utf8 01 "(Ljava/lang/String;)V"
//		fieldRef 09 0001 0021
//		nameAndType 0C 0011 0006
//		string 08 0012
//		fieldRef 09 0001 0024
//		nameAndType 0C 0012 0006
//		string 08 0009
//		fieldRef 09 0001 0027
//		nameAndType 0C 0009 0006
//		string 08 000A
//		fieldRef 09 0001 002A
//		nameAndType 0C 000A 0006
//		string 08 000F
//		fieldRef 09 0001 002D
//		nameAndType 0C 000F 0006
//		string 08 0010
//		fieldRef 09 0001 0030
//		nameAndType 0C 0010 0006
//		utf8 01 "LineNumberTable"
//		utf8 01 "LocalVariableTable"
//		methodRef 0A 0003 0034
//		nameAndType 0C 001E 0014
//		fieldRef 09 0001 0036
//		nameAndType 0C 0005 0006
//		string 08 000E
//		fieldRef 09 0001 0039
//		nameAndType 0C 000E 0006
//		utf8 01 "this"
//		utf8 01 "Lorg/balthie/demo/jvm/bytecode/StringByteCode;"
//		utf8 01 "main"
//		utf8 01 "([Ljava/lang/String;)V"
//		string 08 003F
//		utf8 01 "s1"
//		string 08 0041
//		utf8 01 "s2"
//		class 07 0043
//		utf8 01 "java/lang/StringBuilder"
//		methodRef 0A 0019 0045
//		nameAndType 0C 0046 0047
//		utf8 01 "valueOf"
//		utf8 01 "(Ljava/lang/Object;)Ljava/lang/String;"
//		methodRef 0A 0042 001D
//		methodRef 0A 0042 004A
//		nameAndType 0C 004B 004C
//		utf8 01 "append"
//		utf8 01 "(Ljava/lang/String;)Ljava/lang/StringBuilder;"
//		methodRef 0A 0042 004E
//		nameAndType 0C 004F 0050
//		utf8 01 "toString"
//		utf8 01 "()Ljava/lang/String;"
//		fieldRef 09 0052 0054
//		class 07 0053
//		utf8 01 "java/lang/System"
//		nameAndType 0C 0055 0056
//		utf8 01 "out"
//		utf8 01 "Ljava/io/PrintStream;"
//		methodRef 0A 0058 005A
//		class 07 0059
//		utf8 01 "java/io/PrintStream"
//		nameAndType 0C 005B 001F
//		utf8 01 "println"
//		utf8 01 "args"
//		utf8 01 "[Ljava/lang/String;"
//		utf8 01 "s3"
//		utf8 01 "os1"
//		utf8 01 "os2"
//		utf8 01 "os3"
//		utf8 01 "SourceFile"
//		utf8 01 "StringByteCode.java"
//	}
//	0021 0001 0003 0000 Interfaces {
//	}
//	000A Fields {
//		field 0012 0005 0006 0001 Attributes {
//			constantValue 0007 00000002 0008
//		}
//		field 000A 0009 0006 0000 Attributes {
//		}
//		field 001A 000A 0006 0000 Attributes {
//		}
//		field 000A 000B 0006 0000 Attributes {
//		}
//		field 001A 000C 0006 0001 Attributes {
//			constantValue 0007 00000002 000D
//		}
//		field 0012 000E 0006 0000 Attributes {
//		}
//		field 000A 000F 0006 0000 Attributes {
//		}
//		field 001A 0010 0006 0000 Attributes {
//		}
//		field 000A 0011 0006 0000 Attributes {
//		}
//		field 001A 0012 0006 0000 Attributes {
//		}
//	}
//	0003 Methods {
//		method 0008 0013 0014 0001 Attributes {
//			code 0015 0000007C 0003 0000 00000040 Code {
//				ldc 12 16
//				putstatic B3 0017
//				new BB 0019
//				dup 59
//				ldc 12 1B
//				invokespecial B7 001C
//				putstatic B3 0020
//				new BB 0019
//				dup 59
//				ldc 12 22
//				invokespecial B7 001C
//				putstatic B3 0023
//				ldc 12 25
//				putstatic B3 0026
//				ldc 12 28
//				putstatic B3 0029
//				new BB 0019
//				dup 59
//				ldc 12 2B
//				invokespecial B7 001C
//				putstatic B3 002C
//				new BB 0019
//				dup 59
//				ldc 12 2E
//				invokespecial B7 001C
//				putstatic B3 002F
//				return B1
//			} 0000 ExceptionTable {
//			} 0002 Attributes {
//				lineNumberTable 0031 00000022 0008 Table {
//					lineNumber 0000 000B
//					lineNumber 0005 0015
//					lineNumber 0011 0017
//					lineNumber 001D 001A
//					lineNumber 0022 001B
//					lineNumber 0027 001D
//					lineNumber 0033 001E
//					lineNumber 003F 001F
//				}
//				localVariableTable 0032 00000002 0000 Table {
//				}
//			}
//		}
//		method 0001 001E 0014 0001 Attributes {
//			code 0015 0000004E 0004 0001 00000018 Code {
//				aload_0 2A
//				invokespecial B7 0033
//				aload_0 2A
//				ldc 12 08
//				putfield B5 0035
//				aload_0 2A
//				new BB 0019
//				dup 59
//				ldc 12 37
//				invokespecial B7 001C
//				putfield B5 0038
//				return B1
//			} 0000 ExceptionTable {
//			} 0002 Attributes {
//				lineNumberTable 0031 00000012 0004 Table {
//					lineNumber 0000 0003
//					lineNumber 0004 0005
//					lineNumber 000A 000F
//					lineNumber 0017 0003
//				}
//				localVariableTable 0032 0000000C 0001 Table {
//					localVariable 0000 0018 003A 003B 0000
//				}
//			}
//		}
//		method 0009 003C 003D 0001 Attributes {
//			code 0015 00000109 0003 0007 00000073 Code {
//				ldc 12 3E
//				astore_1 4C
//				ldc 12 40
//				astore_2 4D
//				new BB 0042
//				dup 59
//				aload_1 2B
//				invokestatic B8 0044
//				invokespecial B7 0048
//				aload_2 2C
//				invokevirtual B6 0049
//				invokevirtual B6 004D
//				astore_3 4E
//				new BB 0019
//				dup 59
//				ldc 12 3E
//				invokespecial B7 001C
//				astore 3A 04
//				new BB 0019
//				dup 59
//				ldc 12 40
//				invokespecial B7 001C
//				astore 3A 05
//				new BB 0042
//				dup 59
//				aload 19 04
//				invokestatic B8 0044
//				invokespecial B7 0048
//				aload 19 05
//				invokevirtual B6 0049
//				invokevirtual B6 004D
//				astore 3A 06
//				getstatic B2 0051
//				aload_1 2B
//				invokevirtual B6 0057
//				getstatic B2 0051
//				aload_2 2C
//				invokevirtual B6 0057
//				getstatic B2 0051
//				aload_3 2D
//				invokevirtual B6 0057
//				getstatic B2 0051
//				aload 19 04
//				invokevirtual B6 0057
//				getstatic B2 0051
//				aload 19 05
//				invokevirtual B6 0057
//				getstatic B2 0051
//				aload 19 06
//				invokevirtual B6 0057
//				return B1
//			} 0000 ExceptionTable {
//			} 0002 Attributes {
//				lineNumberTable 0031 00000036 000D Table {
//					lineNumber 0000 0022
//					lineNumber 0003 0023
//					lineNumber 0006 0024
//					lineNumber 0019 0025
//					lineNumber 0024 0026
//					lineNumber 002F 0027
//					lineNumber 0045 0028
//					lineNumber 004C 0029
//					lineNumber 0053 002A
//					lineNumber 005A 002B
//					lineNumber 0062 002C
//					lineNumber 006A 002D
//					lineNumber 0072 002E
//				}
//				localVariableTable 0032 00000048 0007 Table {
//					localVariable 0000 0073 005C 005D 0000
//					localVariable 0003 0070 003F 0006 0001
//					localVariable 0006 006D 0041 0006 0002
//					localVariable 0019 005A 005E 0006 0003
//					localVariable 0024 004F 005F 0006 0004
//					localVariable 002F 0044 0060 0006 0005
//					localVariable 0045 002E 0061 0006 0006
//				}
//			}
//		}
//	}
//	0001 Attributes {
//		sourceFile 0062 00000002 0063
//	}
//}


